package com.ruoyi.common.datasource.mybatis;



import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.IService;

import breeze.framework.log.SimpleLog;
import breeze.framework.reflect.Reflector;

import java.lang.reflect.Field;

/**
 * @author: breeze
 * 通过前端传入可以强制设置为null的字段,
 * 	每次更新的时候的判断是否有指定字段,指定字段是否为null,如果都存在,则提前执行一次更新.
 */
public class UpdateWrapperUtils {
	
	public static <T> boolean forceUpdateNull(IService<T> service,T entity,String idField,String...fieldNames) {
		if(null == idField) {
			idField = "id";
		}
		int count = 0;
		UpdateWrapper<T> updateWrapper = new UpdateWrapper<T>();
		updateWrapper.eq(idField, Reflector.getProperty(entity,idField));
		for (int i = 0; i < fieldNames.length; i++) {
			String fieldName = fieldNames[i];
			try {
				Object value = Reflector.getProperty(entity,fieldName);
				if(null != value) {
					continue;
				}
				updateWrapper.set(camelToUnderline(fieldName),null);
				count++;
			} catch (Exception e) {
				SimpleLog.debug(e.getLocalizedMessage());
			}
		}
		if(count > 0) {
			try {
				return service.update(updateWrapper);
			} catch (Exception e) {
				return false;
			}
		}else {
			return false;
		}
	}
	
	
    /**
     * 传入一个实体对象，返回他的UpdateWrapper对象，入股属性未null,在修改数据库时会set null
     * @param r
     * @param key where字段
     * @param <R>
     * @return
     * @throws Exception
     */
    public static <R> UpdateWrapper<R> generateUpdateWrapperByKey(R r, String key) throws Exception {
        UpdateWrapper<R> updateWrapper = new UpdateWrapper<>();
        //获取类中所有的非继承自父类的字段(Field) 如果需要获取全部(包括继承自父类的)使用FieldUtils.getAllFields(r.getClass())
        Field[] field = r.getClass().getDeclaredFields();
        for (Field f:field){
            f.setAccessible(true);
            if(key.equals(f.getName())){
                updateWrapper.eq(camelToUnderline(key),f.get(r));
            } else{
                TableField annotation = f.getAnnotation(TableField.class);
                //先判断没带有注解@TableField(exist = false)
                if(annotation == null || annotation.exist() != false){
                    if(f.get(r) == null){
                        updateWrapper.set(camelToUnderline(f.getName()),null);
                    } else {
                        updateWrapper.set(camelToUnderline(f.getName()),f.get(r));
                    }
                }
            }
        }
        return updateWrapper;
    }


    /**
     * 这个方法接受一个字符串参数，返回一个字符串，将 Java 风格的字符串转换为数据库风格的字符串。例如，将 "userName" 转换为 "user_name"。
     * @param param
     * @return
     */
    public static String camelToUnderline(String param) {
        if (param == null || param.isEmpty()) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        char[] charArray = param.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];
            if (Character.isUpperCase(c)) {
                sb.append("_");
            }
            sb.append(Character.toLowerCase(c));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
//        User user = new User();
//        user.setId(73850189L);
//        user.setPhone("12346789");
//        UpdateWrapper<User> updateWrapper = UpdateWrapperUtils.generateUpdateWrapperByKey(user,"id");
//        userMapper.update(null,updateWrapper);
	}

}
